﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TechProg
{
  public partial class Form2 : Form
  {

    public Form2()
    {
      InitializeComponent();
    }

    bool k = false;// для закрытия формы
    RunTuring RunClass = new RunTuring();
    int Position = 0;

    private void Form2_FormClosing_1(object sender, FormClosingEventArgs e)
    {
      if (k == false)
      {
        e.Cancel = false;
        var result = MessageBox.Show("Вы уверены что хотите выйти из программы?", "Машина Тьюринга", MessageBoxButtons.YesNo);
        if (result == DialogResult.Yes)
        { }
        else
          e.Cancel = true;
      }
    }

    private void выходToolStripMenuItem_Click(object sender, EventArgs e)
    {
      var result1 = MessageBox.Show("Вы уверены что хотите выйти из программы?", "Машина Тьюринга", MessageBoxButtons.YesNo);
      if (result1 == DialogResult.Yes)
      { k = true; Close(); }
    }

    int r = 4; //счетчик столбцов т к 3 состояния у нас уже есть
    int t = 4;//счетчик строк т к 3 символа у нас уже есть
    int s = 4;//счетчик ленты


    private void Form2_Load(object sender, EventArgs e)
    {
      start();
    }
    private void start()
    {
      dataGridView2.Rows.Clear();
      dataGridView2.Rows.Add("_");
      dataGridView2.Rows.Add("a");
      dataGridView2.Rows.Add("b");
      RunClass.alphabet[0] = "_";
      RunClass.alphabet[1] = "a";
      RunClass.alphabet[2] = "b";
    }

    private void button4_Click(object sender, EventArgs e)
    {
      if (r == 16) MessageBox.Show("Допустимо не более 15 состояний!");
      else
      {
        dataGridView2.Columns.Add("Column" + Convert.ToString(r + 4), Convert.ToString(r));
        r = r + 1;
      }
    }

    private void button5_Click(object sender, EventArgs e)
    {
      dataGridView2.Columns.Remove("Column" + Convert.ToString(r + 3));
      r = r - 1;
    }

    private void button8_Click(object sender, EventArgs e)
    {
      if (textBox2.Text == "" || (RunClass.CheckAlphabet(textBox2.Text) == 1))
        MessageBox.Show("Введите новый символ алфавита!");
      else //тут надо бы проверку сделать что символы разные должны быть, но чет не получилось. много времени убил. потом доделаю
      //сделано
      {
        RunClass.alphabet[dataGridView2.Rows.Count - 1] = textBox2.Text;
        t = t + 1;
        dataGridView2.Rows.Add(textBox2.Text);
      }

    }

    private void button6_Click(object sender, EventArgs e)
    {
      //тут еще надо добавить кучу проверок
      //обращение к ячейкам
      if ((textBox2.Text == "") && (textBox3.Text == "") && (textBox4.Text == "")) MessageBox.Show("Заполните поля!");
      else
      {
        int n = 0, m = 0;
        try
        {
          n = Convert.ToInt32(textBox3.Text); //строка
          m = Convert.ToInt32(textBox4.Text);  //столбец
        }
        catch
        {
          MessageBox.Show("Поля \"Строка\" и \"Столбец\" должны содержать только числа!");
          return;
        }
        string s = textBox2.Text; //содержимое

        if ((m > (r - 1)) || (n > (t - 1))) MessageBox.Show("Сивола не существует!");
        else
        {
          dataGridView2.Rows[n - 1].Cells[m].Value = s;
          RunClass.AddRule(dataGridView2[0, n - 1].Value.ToString(), s.Substring(0, 1),
            Convert.ToInt32(dataGridView2.Columns[m].HeaderCell.Value.ToString()), Convert.ToInt32(s.Substring(2, 1)), s[1]);
        }

      }
    }

    private void button7_Click(object sender, EventArgs e)
    {
      string tmp;
      for (int i = 0; i < dataGridView1.ColumnCount; i++)
      {
        try
        {
          tmp = dataGridView1[i, 0].Value.ToString();
        }
        catch
        {
          dataGridView1[i, 0].Value = "_";
          tmp = "_";
        }
        if (RunClass.CheckAlphabet(tmp) == 0)
        {
          MessageBox.Show("Символ \"" + tmp + "\" отсутствует в алфавите");
          return;
        }
        else
        {
          RunClass.lenta[i + 1] = tmp;
        }
        if (RunClass.LentaLength != dataGridView1.ColumnCount)
        {
          RunClass.LentaLength = dataGridView1.ColumnCount;
        }
      }
    }

    public void UpdateTape()
    {
      for (int i = 0; i < RunClass.LentaLength; i++)
      {
        if (i < s - 1)
        {
          dataGridView1[i, 0].Value = RunClass.lenta[i + 1];
        }
        else
        {
          dataGridView1.Columns.Add("Column" + s.ToString(), s.ToString());
          dataGridView1[i, 0].Value = RunClass.lenta[i + 1];
          s++;
        }
      }
    }


    private void button3_Click(object sender, EventArgs e)
    {
      UnselectTape();

      int tmp;
      tmp = RunClass.step();
      if (tmp == 1)
      {
        MessageBox.Show("Лента не может быть больше 100");
        RunClass.FirstStep = true;
      }
      else if (tmp == 2)
      {
        MessageBox.Show("Не найдено правило по данному состоянию");
        RunClass.FirstStep = true;
      }
      UpdateTape();
      dataGridView1[RunClass.Position, 0].Selected = true;
      if (RunClass.Condition == 0)
      {
        MessageBox.Show("Алгоритм перешел в последнее состояние");
        RunClass.FirstStep = true;
      }
    }

    private void button9_Click(object sender, EventArgs e)
    {

    }

    private void button10_Click(object sender, EventArgs e)
    {
      if (s == 101) MessageBox.Show("Допустимая длина ленты, не более 100 элементов");
      else
      {
        dataGridView1.Columns.Add("Column" + s.ToString(), s.ToString());
        s = s + 1;
      }
    }

    private void button11_Click(object sender, EventArgs e)
    {
      if (s < 2) MessageBox.Show("Лента должна иметь хотя бы одну ячейку");
      else
      {
        dataGridView1.Columns.Remove("Column" + Convert.ToString(s - 1));
        s = s - 1;
      }
    }

    public void UnselectTape()
    {
      for(int i = 0; i< dataGridView1.Columns.Count;i++)
        dataGridView1[i, 0].Selected = false;
    }

    public void TimerEventProcessor(Object myObject,
                                            EventArgs myEventArgs)
    {
      // Displays a message box asking whether to continue running the timer.
      UnselectTape();
      dataGridView1[RunClass.Position, 0].Selected = true;
      string condition = dataGridView1[Position, 0].Value.ToString();
      int tmp;
      tmp = RunClass.step();
      if (tmp == 1)
      {
        MessageBox.Show("Лента не может быть больше 100!\r\nАвтоматическое выполнение остановлено.");
        RunClass.FirstStep = true;
        timer1.Stop();
      }
      else if (tmp == 2)
      {
        MessageBox.Show("Не найдено правило по данному состоянию\r\nАвтоматическое выполнение остановлено.");
        RunClass.FirstStep = true;
        timer1.Stop();
      }
      UpdateTape();
      if (RunClass.Condition == 0)
      {
        MessageBox.Show("Алгоритм перешел в последнее состояние\r\nАвтоматическое выполнение остановлено.");
        RunClass.FirstStep = true;
        timer1.Stop();
      }
    }


    private void button1_Click(object sender, EventArgs e)
    {
      timer1.Enabled = true;
      timer1.Start();
      timer1.Tick += new EventHandler(TimerEventProcessor);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      timer1.Stop();
    }

    private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }
  }

}
       
 

